/*************************************************
* Title：TinyToolKit
* Author：Opportunity 
* Describe：实现二进制的序列化和反序列化
* CreateTime：2020-12-16 17:55:07
* Version：1.0
* Modify Recorder：
*************************************************/

using System.IO;

namespace TinyToolKit
{
    public static partial class TinyUtility
    {
        public static partial class Binary
        {
            private static IBinaryTemplate _template;

            private static IBinaryTemplate _binaryTemplate
            {
                get => _template ?? (_template = new DefaultBinaryTemplate());
                set => _template = value;
            }
            
            public static void SetBinaryTemplate(IBinaryTemplate binaryTemplate)
            {
                _binaryTemplate = binaryTemplate;
            }
            
            /// <summary>
            /// 二进制序列化
            /// </summary>
            /// <param name="filePath">二进制序列化文件保存的地址</param>
            /// <param name="obj">需要进行二进制序列化的对象</param>
            /// <returns>序列化成功返回true，否则返回false</returns>
            public static bool BinarySerialize(string filePath, object obj) 
            {
                if (string.IsNullOrEmpty(filePath))
                {
                    TLogTool.Error("二进制保存路径不能为空");
                    return false;
                }

                if (obj == null)
                {
                    TLogTool.Error("二进制序列化对象不能为Null");
                    return false;
                }

                return _binaryTemplate.BinarySerialize(filePath, obj);
            }
            
            /// <summary>
            /// 二进制反序列化
            /// </summary>
            /// <param name="stream">需要反序列化的文件流</param>
            /// <returns>返回反序列化的对象</returns>
            public static object BinaryDeserialize(Stream stream) 
            {
                if (stream == null)
                {
                    TLogTool.Error("Stream对象不能为Null");
                    return null;
                }

                return _binaryTemplate.BinaryDeserialize(stream);
            }
            
            /// <summary>
            /// 二进制反序列化
            /// </summary>
            /// <param name="filePath">需要反序列化的文件路径</param>
            /// <returns>返回反序列化的对象</returns>
            public static object BinaryDeserialize(string filePath) 
            {
                if (string.IsNullOrEmpty(filePath))
                {
                    TLogTool.Error("二进制反序列化路径不能为空");
                    return null;
                }

                return _binaryTemplate.BinaryDeserialize(filePath);
            }
        }   
    }
}
